package es.antonio.duarte.abrahamAdmin.struts.actions;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import es.antonio.duarte.abrahamAdmin.model.Cosas;
import es.antonio.duarte.abrahamAdmin.servicios.CosasServicio;
import es.antonio.duarte.abrahamAdmin.struts.Constantes;
import es.antonio.duarte.abrahamAdmin.struts.forms.InsertarOModificarCosasForm;

/**
 * Utiliza el CosasServicio para insertar o actualizar una cosa en BBDD. La
 * decisión de insertar o actualizar está basada en el id de la cosa, si es
 * nulo lo inserta asignandole previamente la fecha del momento de insertarlo,
 * si no es nulo lo actualiza. Una vez insertado o actualizado vuelve a generar
 * la lista actualizada de todos las cosas con una consulta a base de datos
 * ya que es posible que otros usuarios hayan eliminado otras cosas
 * paralelamente y la guarda en la request bajo el nombre indicado en
 * Constantes.NOMBRE_VARIABLE_COSAS.
 */
public class InsertarCosasAction extends BaseAction {

   /** Manejador de trazas. */
   private final Log log = LogFactory.getLog(InsertarCosasAction.class);

   /**
    * El servicio de diario a utilizar para todas las operaciones relacionadas
    * con ellos.
    */
   private CosasServicio servicio;

   /**
    * Ejecucion del action. Inserta la cosa obteniendo los datos del
    * actionForm.
    * @param mapping ActionMapping asociado al action
    * @param form ActionForm asocido al action
    * @param request HttpServletRequest asociado al action
    * @param response HttpServletResponse asociado al action
    * @return ActionForward
    * @throws Exception En caso de error en la ejecucion del action
    * @see org.apache.struts.action.Action#execute(org.apache.struts.action.ActionMapping,
    *      org.apache.struts.action.ActionForm,
    *      javax.servlet.http.HttpServletRequest,
    *      javax.servlet.http.HttpServletResponse)
    */
   @Override
   public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
      logDebug(log, "Inicio de la acción de insertarCosa");
      InsertarOModificarCosasForm formulario = (InsertarOModificarCosasForm) form;
      logDebug(log, "Recuperando cosa del formulario");
      Cosas cosasAInsertar = new Cosas();
      cosasAInsertar
               .setCuerpo(formulario.getCosasCuerpo());
      cosasAInsertar.setId(formulario.getCosasId());
      cosasAInsertar.setTitulo(formulario.getCosasTitulo());
      cosasAInsertar.setFecha(formulario.getCosasFecha());
      logDebug(log,
               "Decidiendo si insertar o actualizar cosa basandose en su ID");
      if (cosasAInsertar.getId() == null) {
         logDebug(log, "ID de la cosa nulo, insertando cosa...");
         logDebug(log, "Insertando cosa " + cosasAInsertar);
         servicio.insertar(cosasAInsertar);
         logDebug(log, "Reseteando cosa en el formulario");
         resetearCosa(formulario);
      } else {
         logDebug(log, "ID de cosa no nulo, actualizando cosa...");
         servicio.actualizar(cosasAInsertar);
         logDebug(log, "Reseteando cosa en el formulario");
         resetearCosa(formulario);
      }
      logDebug(log, "Recargando la lista de cosas");
      logDebug(log, servicio.consultar().toString());
      request.setAttribute(Constantes.NOMBRE_VARIABLE_COSAS, servicio
               .consultar());
      logDebug(log, "Lista recargada, volviendo a la página inicial");
      return mapping.getInputForward();

   }

   /**
    * Resetea los diarios.
    * @param formulario Formulario asociado al action
    */
   private void resetearCosa(
            final InsertarOModificarCosasForm formulario) {
      formulario.setCosasCuerpo(null);
      formulario.setCosasFecha(null);
      formulario.setCosasId(null);
      formulario.setCosasTitulo(null);
      
   }

   /**
    * Obtiene el valor de servicio.
    * @return Valor de servicio
    */
   public CosasServicio getServicio() {
      return servicio;
   }

   /**
    * Asigna el valor de servicio.
    * @param servicio Valor a asignar
    */
   public void setServicio(final CosasServicio servicio) {
      this.servicio = servicio;
   }
}
